home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 04 / 1 / DISK0413.ZIP / BWVID.ASM < prev    next >
Assembly Source File  |  1985-05-17  |  9KB  |  176 lines

  1. ;**************************************************************************
  2. ; The following is an Interrupt/Stay resident program that intercepts all
  3. ; BIOS video calls involving color and maps them to black and white calls.
  4. ; It will eliminate many of the fuzzy screens that arise from having
  5. ; a BW monitor hooked up to a color graphics board.
  6. ; THIS PROGRAM IS ONLY USEFUL IF YOU HAVE A BLACK AND WHITE HIGH RESOLUTION
  7. ; MONITOR CONNECTED TO YOUR GRAPHICS CARD.
  8. ;
  9. ; PROBLEMS THAT THIS ROUTINE SOLVES:
  10. ;    This program, when installed will remove all the fuzzy displays that
  11. ;    result when color display instructions are sent to BW monitor through
  12. ;    the BIOS system.  The VAST MAJORITY of available code does go through
  13. ;    BIOS so this will catch most of those problems.  This program works
  14. ;    as follows:
  15. ;    Force mode to 40x25 BW if BIOS call is for 40x25 color
  16. ;    Force mode to 80x25 BW if BIOS call is for 80x25 color
  17. ;    Force mode to 320x200 BW if BIOS call is for 320x200 color
  18. ;    Intercepts BIOS calls to write attributes and characters and changes
  19. ;       them in such a way that:
  20. ;       *  If forground is any color except black then it is forced to white
  21. ;       *  If background is any color except white then it is forced to black
  22. ;    Intercepts BIOS graphic calls to set the palette and changes them such that:
  23. ;       *  Background is always black
  24. ;       *  Forground is always white
  25. ;    The "Write Dot" and "Write Teletype" intercept functions both map fore-
  26. ;       ground to white, regardless of the intended color.
  27. ;
  28. ; PROBLEMS THAT THIS ROUTINE CREATES:
  29. ;    When information is transmitted to the view SOLELY through color
  30. ;    information, then that information is lost in this transformation.
  31. ;    (naturally!).  So if, for example, a game has a color bar that switches
  32. ;    from green to red to signify danger, that information will be lost.
  33. ;    This is because generally all forground colors are forced to white and
  34. ;    all background colors are forced to black.  This is not so much a
  35. ;    problem created by this program as it is a problem with Black and White
  36. ;    monitors not conveying as much information as Color Monitors.
  37. ;
  38. ; PROBLEMS THAT THIS ROUTINE DOES NOTHING ABOUT:
  39. ;    Any video calls that go straight to the hardware instead of going
  40. ;    through BIOS.  It is unfortunately the case that some VERY sophisticated
  41. ;    programs that really have snazzy graphics do go to the hardware directly
  42. ;    because of the speed benefits.
  43. ;
  44. ; After installing this program, all of the IBM Diagnostic tests look
  45. ; reasonable.
  46. ;
  47. ; When loaded this program uses 226 Decimal bytes of memory (It relocates
  48. ;    itself down into the unused portion of the Program Segment Prefix
  49. ;    to save memory)
  50. ;
  51. ; Written 5/02/85 by:
  52. ;    Scott W. Killen
  53. ;    P.O Box 27012
  54. ;    Austin Texas  78705
  55. ;    CIS ID: 76703,734
  56. ;
  57. ; This program is GiveAware!  The only payment I ask is your comments and
  58. ; bug reports.
  59. ;**************************************************************************
  60. white      MACRO   reg            ; Force register to have white color code
  61.            LOCAL   continue       ;    if not backgound.
  62.            MOV     AH,0FCH        ; Get ready for masking high bits
  63.            AND     AH,reg         ; Save High order bits
  64.            AND     reg,03H        ; test for foreground or background
  65.            JZ      continue       ; If background then we are finished
  66.            OR      reg,03H        ; Force to white forground
  67. continue:  OR      reg,AH         ; Recombine the two parts
  68.            ENDM
  69.  
  70. CSEG    SEGMENT
  71.         ASSUME CS:CSEG
  72.         ORG 100H
  73.  
  74. CODESTART   EQU  5CH
  75.  
  76. BWVID  PROC NEAR
  77.  
  78.           JMP     initialize
  79.  
  80. entry_point:
  81. test0:      CMP     AH,00H         ; Is this set mode?
  82.             JNE     test11         ; If not then try other test
  83.             CMP     AL, 03H        ; Check if Alpha Mode
  84.             JG      test0a         ; Jump if not Alpha mode
  85.             AND     AL, 02H        ; Force black and white display
  86.             JMP     continue0      ;
  87. test0a:     CMP     AL, 05H        ; Check for Medium Res Graphics
  88.             JG      continue0      ; Jump if not Medium Res Graphics
  89.             MOV     AL, 05H        ; Force black and white graphics
  90.             EXTRN   DOS_RETURN:FAR
  91. continue0:  JMP     DOS_RETURN     ; This code is modified in line!
  92.                                    ;    Go to normal bios handling.
  93.  
  94. test11:     CMP     AH,0BH         ; Is this the Set Palatte instruction
  95.             JNE     test9          ; if not, then continue
  96.             CMP     BH, 0          ; Is background color being set?
  97.             JNZ     test11a        ; if not go to set forground color set
  98.             MOV     BL, 0          ; Background color is always black
  99.             JMP     continue11
  100. test11a:    MOV     BL,01H         ; Foreground color should include set with White
  101. continue11: JMP     DOS_RETURN     ; This code is modified in line!
  102.  
  103. test9:      CMP     AH,09H         ; Is this a Write Character and Attribute
  104.             JNE     test14         ; if not then try next test
  105.             MOV     AH,BL          ; Use the AH register for a minute
  106.             AND     BL,07H         ; Test for some foreground color
  107.             JZ      test9a         ; Jump if foreground is black
  108.             OR      AH,07H         ; Force foreground to white
  109. test9a:     MOV     BL,AH          ; Restore BL to old value with appropriate foreground
  110.             AND     BL,70H         ; Test for background color
  111.             XOR     BL,70H         ; Is it white?
  112.             JZ      test9b         ; Jump if background color is white
  113.             AND     AH,8FH         ; Force background to black
  114. test9b:     MOV     BL,AH          ; Ok set BL to corrected value
  115.             MOV     AH,09H         ; Restore AH and return to BIOS
  116. continue9:  JMP     DOS_RETURN     ; This code is modified in line!
  117.  
  118. test14:     CMP     AH,0EH         ; Test for write teletype routine
  119.             JNE     test12         ; Ok, proceed
  120.             WHITE   BL             ; Force forground (if any) to white
  121.             MOV     AH,0EH         ; Restore function code
  122. continue14: JMP     DOS_RETURN
  123.  
  124. test12:     CMP     AH,0CH         ; Is this the write dot routine?
  125.             JNE     continue12     ; if not then continue
  126.             WHITE   AL             ; Force the color (if any) to white
  127.             MOV     AH,0CH         ; Now restore function code
  128. continue12: JMP     DOS_RETURN
  129.  
  130. initialize:
  131.         PUSH    DS                          ; Save DS for later use
  132.         XOR     AX,AX                       ; Clear AX
  133.         MOV     DS,AX                       ; Prepare to save original interrupt
  134.         MOV     AX,40H
  135. ;
  136.         MOV     SI,AX                       ; Source for INT 10h as provided for in the interrupt table
  137.         MOV     DI, offset [continue0+1]    ; Destination in the code segment for moving this pointer
  138.         MOVSW                               ; Move the two word address
  139.         MOVSW
  140.         MOV     SI,AX                       ; Source for INT 10h as provided for in the interrupt table
  141.         MOV     DI, offset [continue9+1]    ; Destination in the code segment for moving this pointer
  142.         MOVSW                               ; Move the two word address
  143.         MOVSW
  144.         MOV     SI,AX                       ; Source for INT 10h as provided for in the interrupt table
  145.         MOV     DI, offset [continue11+1]   ; Destination in the code segment for moving this pointer
  146.         MOVSW                               ; Move the two word address
  147.         MOVSW
  148.         MOV     SI,AX                       ; Source for INT 10h as provided for in the interrupt table
  149.         MOV     DI, offset [continue12+1]   ; Destination in the code segment for moving this pointer
  150.         MOVSW                               ; Move the two word address
  151.         MOVSW
  152.         MOV     SI,AX                       ; Source for INT 10h as provided for in the interrupt table
  153.         MOV     DI, offset [continue14+1]   ; Destination in the code segment for moving this pointer
  154.         MOVSW                               ; Move the two word address
  155.         MOVSW
  156. ;
  157.         MOV     AX,CODESTART           ; Fill AX with starting point
  158.         MOV     [SI-04H],AX            ; Move offset in line
  159.         MOV     [SI-02H],CS            ; Move segment value in line
  160. ;
  161.         POP     DS                     ; Restore the data segment
  162.         MOV     CX, offset initialize  ; These lines relocate the interrupt
  163.         SUB     CX, offset entry_point ;   handler down into the unused
  164.         MOV     DI, CODESTART          ;   portion of the Program Segment
  165.         MOV     SI, offset entry_point ;   Prefix (to save memory)!
  166.  REP    MOVSB                          ;
  167. ;
  168.         MOV     DX, offset initialize  ; Top of code address
  169.         SUB     DX, offset entry_point ; Width of code
  170.         ADD     DX, CODESTART          ; Bias by starting address
  171.         INT     27H                    ; Terminate but stay resident
  172.  
  173. BWVID  ENDP
  174. CSEG    ENDS
  175.         END  BWVID
  176.